#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
NumPy 基础操作示例
演示NumPy的核心功能和基本用法
"""

import numpy as np

def demonstrate_array_creation():
    """演示数组创建的各种方法"""
    print("=== 数组创建示例 ===")
    
    # 1. 从Python列表创建
    print("1. 从Python列表创建:")
    list_1d = [1, 2, 3, 4, 5]
    arr_1d = np.array(list_1d)
    print(f"一维数组: {arr_1d}")
    
    list_2d = [[1, 2, 3], [4, 5, 6]]
    arr_2d = np.array(list_2d)
    print(f"二维数组:\n{arr_2d}")
    
    # 2. 使用内置函数创建
    print("\n2. 使用内置函数创建:")
    zeros = np.zeros((2, 3))
    print(f"零数组:\n{zeros}")
    
    ones = np.ones((2, 3))
    print(f"一数组:\n{ones}")
    
    identity = np.eye(3)
    print(f"单位矩阵:\n{identity}")
    
    arange = np.arange(0, 20, 3)
    print(f"等差数列: {arange}")
    
    linspace = np.linspace(0, 1, 10)
    print(f"线性空间: {linspace}")
    
    # 3. 随机数组
    print("\n3. 随机数组:")
    np.random.seed(42)  # 设置随机种子，确保结果可重复
    random_arr = np.random.random((2, 3))
    print(f"随机数组:\n{random_arr}")
    
    normal_arr = np.random.normal(0, 1, (2, 3))
    print(f"正态分布随机数:\n{normal_arr}")

def demonstrate_array_properties():
    """演示数组属性"""
    print("\n=== 数组属性示例 ===")
    
    arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
    
    print(f"数组:\n{arr}")
    print(f"形状 (shape): {arr.shape}")
    print(f"维度 (ndim): {arr.ndim}")
    print(f"大小 (size): {arr.size}")
    print(f"数据类型 (dtype): {arr.dtype}")
    print(f"每个元素字节数 (itemsize): {arr.itemsize}")
    print(f"总字节数: {arr.nbytes}")

def demonstrate_basic_operations():
    """演示基本数学运算"""
    print("\n=== 基本数学运算示例 ===")
    
    a = np.array([1, 2, 3, 4])
    b = np.array([5, 6, 7, 8])
    
    print(f"数组a: {a}")
    print(f"数组b: {b}")
    
    print(f"加法 a + b: {a + b}")
    print(f"减法 a - b: {a - b}")
    print(f"乘法 a * b: {a * b}")
    print(f"除法 a / b: {a / b}")
    print(f"幂运算 a ** 2: {a ** 2}")
    print(f"取余 a % 2: {a % 2}")
    
    # 与标量运算
    print(f"\n数组与标量运算:")
    print(f"a + 10: {a + 10}")
    print(f"a * 2: {a * 2}")

def demonstrate_universal_functions():
    """演示通用函数（ufuncs）"""
    print("\n=== 通用函数示例 ===")
    
    arr = np.array([1, 4, 9, 16, 25])
    print(f"原数组: {arr}")
    
    # 数学函数
    print(f"平方根: {np.sqrt(arr)}")
    print(f"自然对数: {np.log(arr)}")
    print(f"以10为底的对数: {np.log10(arr)}")
    print(f"指数函数: {np.exp([1, 2, 3])}")
    
    # 三角函数
    angles = np.array([0, np.pi/6, np.pi/4, np.pi/3, np.pi/2])
    print(f"\n角度 (弧度): {angles}")
    print(f"正弦值: {np.sin(angles)}")
    print(f"余弦值: {np.cos(angles)}")
    print(f"正切值: {np.tan(angles)}")

def demonstrate_indexing_slicing():
    """演示索引和切片"""
    print("\n=== 索引和切片示例 ===")
    
    # 一维数组索引
    arr_1d = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    print(f"一维数组: {arr_1d}")
    print(f"第3个元素: {arr_1d[2]}")
    print(f"最后一个元素: {arr_1d[-1]}")
    print(f"前5个元素: {arr_1d[:5]}")
    print(f"每隔2个取一个: {arr_1d[::2]}")
    
    # 二维数组索引
    arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    print(f"\n二维数组:\n{arr_2d}")
    print(f"第2行第3列元素: {arr_2d[1, 2]}")
    print(f"第2行: {arr_2d[1, :]}")
    print(f"第3列: {arr_2d[:, 2]}")
    print(f"前2行前2列:\n{arr_2d[:2, :2]}")

def demonstrate_boolean_indexing():
    """演示布尔索引"""
    print("\n=== 布尔索引示例 ===")
    
    arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
    print(f"原数组: {arr}")
    
    # 布尔条件
    mask = arr > 5
    print(f"大于5的掩码: {mask}")
    print(f"大于5的元素: {arr[mask]}")
    
    # 复合条件
    mask_complex = (arr > 3) & (arr < 8)
    print(f"3到8之间的元素: {arr[mask_complex]}")
    
    # 修改满足条件的元素
    arr_copy = arr.copy()
    arr_copy[arr_copy % 2 == 0] = -1  # 将偶数替换为-1
    print(f"偶数替换为-1: {arr_copy}")

def demonstrate_array_reshaping():
    """演示数组重塑"""
    print("\n=== 数组重塑示例 ===")
    
    arr = np.arange(12)
    print(f"原始一维数组: {arr}")
    
    # 重塑为2D
    arr_2d = arr.reshape(3, 4)
    print(f"重塑为3x4:\n{arr_2d}")
    
    arr_2d_alt = arr.reshape(4, 3)
    print(f"重塑为4x3:\n{arr_2d_alt}")
    
    # 重塑为3D
    arr_3d = arr.reshape(2, 2, 3)
    print(f"重塑为2x2x3:\n{arr_3d}")
    
    # 展平
    flattened = arr_2d.flatten()
    print(f"展平: {flattened}")
    
    # 转置
    transposed = arr_2d.T
    print(f"转置:\n{transposed}")

def demonstrate_statistical_functions():
    """演示统计函数"""
    print("\n=== 统计函数示例 ===")
    
    # 设置随机种子
    np.random.seed(42)
    data = np.random.normal(100, 15, (5, 4))
    
    print(f"随机数据 (5x4):\n{data}")
    
    # 基本统计量
    print(f"\n基本统计量:")
    print(f"平均值: {np.mean(data):.2f}")
    print(f"中位数: {np.median(data):.2f}")
    print(f"标准差: {np.std(data):.2f}")
    print(f"方差: {np.var(data):.2f}")
    print(f"最大值: {np.max(data):.2f}")
    print(f"最小值: {np.min(data):.2f}")
    print(f"总和: {np.sum(data):.2f}")
    
    # 沿轴统计
    print(f"\n沿轴统计:")
    print(f"列平均值: {np.mean(data, axis=0)}")
    print(f"行平均值: {np.mean(data, axis=1)}")
    
    # 百分位数
    print(f"\n百分位数:")
    print(f"25%分位数: {np.percentile(data, 25):.2f}")
    print(f"75%分位数: {np.percentile(data, 75):.2f}")

def main():
    """主函数，运行所有示例"""
    print("NumPy 基础操作演示")
    print("=" * 50)
    
    # 运行所有演示函数
    demonstrate_array_creation()
    demonstrate_array_properties()
    demonstrate_basic_operations()
    demonstrate_universal_functions()
    demonstrate_indexing_slicing()
    demonstrate_boolean_indexing()
    demonstrate_array_reshaping()
    demonstrate_statistical_functions()
    
    print("\n演示完成！查看其他示例文件了解更多功能：")
    print("- advanced_examples.py - 高级功能")
    print("- performance_tips.py - 性能优化")
    print("- real_world_examples.py - 实际应用")

if __name__ == "__main__":
    main() 